Poruszanie
Oczywiście, ważnym aspektem gier jest ruch instancji obiektów. Każda instancja ma dwie wbudowane zmienne x oraz y, które wskazują jej pozycję. Dokładniej, wskazują one miejsce gdzie położony jest punkt względem którego rysujemy sprite (origin). Pozycja (0,0) jest lewym-górnym rogiem planszy. Możesz zmieniać pozycję instancji poprzez zmienianie wartości x i y. Jeśli chcesz by obiekt wykonywał skomplikowane ruchy to jest dobra metoda. Zazwyczaj należy umieścić taki kod w zdarzeniu step obiektu. Jeśli obiekt ma poruszać się ze stałą prędkością i kierunkiem, istnieją łatwiejsze sposoby na zrobienie takiego ruchu. Każda instancja posiada prędkość poziomą oraz prędkość pionową. Obydwie zmienne wskazują liczbę pikseli na step. Dodatnia prędkość pozioma oznacza ruch w prawo, a ujemna w lewo. Dodatnia prędkość pionowa oznacza ruch w dół, a ujemna w górę. Wystarczy ustawić te zmienne tylko raz (przykładowo w zdarzeniu Create) aby nadać instancji jednostajny ruch. Istnieje całkiem inna metoda określania ruchu, korzystająca z kierunku (w stopniach 0-359) i prędkości (powinna być nieujemna). Możesz ustawiać i odczytywać te zmienne do określania ruchu. (Wewnętrznie są one zamieniane na wartości prędkości poziomej i pionowej.) Istnieje też tarcie oraz grawitacja i kierunek grawitacji. Ostatecznie, istnieje funkcja motion_add(dir,speed) do dodawania ruchu do aktualnego. Dokładnie rzecz biorąc, każda instancja ma następujące zmienne i funkcje wpływające na ich pozycję i ruch: *'x' Pozycja x *'y' Pozycja y *'xprevious' Poprzednia pozycja x *'yprevious' Poprzednia pozycja y *'xstart' Początkowa pozycja x na planszy *'ystart' Początkowa pozycja y na planszy *'hspeed' Pozioma składowa prędkości *'vspeed' Pionowa składowa prędkości *'direction' Aktualny kierunek (0-360, przeciwnie do ruchu wskazówek zegara, 0 = w prawo) *'speed' Aktualna prędkość (piksele na step). *'friction' Aktualne tarcie (piksele na step). *'gravity' Aktualna siła grawitacji (piksele na step). *'gravity_direction' Kierunek grawitacji (270 oznacza w dół). *'motion_set(dir,speed)' Ustawia ruch z daną prędkością speed w danym kierunku dir. *'motion_add(dir,speed)' Dodaje ruch do aktualnego (poprzez dodawanie wektorów). Dostępnych jest wiele funkcji, które pomogą ci w definiowaniu ruchu: *'place_free(x,y)' Zwraca czy dana instancja umieszczona na pozycji (x,y) jest wolna od kolizji (z obiektami z parametrem solid). Funkcja ta jest zazwyczaj używana przed ruchem w celu sprawdzenia nowej pozycji. *'place_empty(x,y)' Zwraca czy dana instancja umieszczona na pozycji (x,y) nie spotyka innej instancji. Ta funkcja uwzględnia także instancje bez parametru solid. *'place_meeting(x,y,obj)' Zwraca czy dana instancja umieszczona na pozycji (x,y) spotyka obj. obj może być obiektem. Wtedy funkcja zwraca prawdę(true) jeśli jakaś instancja tego obiektu jest spotykana. To może też być id instancji, specjalne słowo all oznaczające instancję dowolnego obiektu lub specjalne słowo other. *'place_snapped(hsnap,vsnap)' Returns whether the instance is aligned with the snapping values. *'move_random(hsnap,vsnap)' Moves the instance to a free random, snapped position, like the corresponding action. *'move_snap(hsnap,vsnap)' Snaps the instance, like the corresponding action. *'move_wrap(hor,vert,margin)' Wraps the instance when it has left the room to the other side. hor indicates whether to wrap horizontaly and vert indicates whether to wrap vertically. margin indicates how far the origin of the instance must be outside the room before the wrap happens. So it is a margin around the room. You typically use this function in the Outside event. *'move_towards_point(x,y,sp)' Przesuwa instancję z prędkością sp do pozycji (x,y). *'move_bounce_solid(adv)' Bounces against solid instances, like the corresponding action. adv indicates whether to use advance bounce, that also takes slanted walls into account. *'move_bounce_all(adv)' Bounces against all instances, instead of just the solid ones. *'move_contact_solid(dir,maxdist)' Przesuwa instancję w danym kierunku do pozycji w której osiągnięty jest kontakt z obiektem z parametrem solid. Jeśli na aktualnej pozycji nie zachodzi kolizja, instancja zostanie położona tuż przed miejscem występowania kolizji. Jeśli kolizja już występuje instancja nie jest przesuwana. Możliwe jest sprecyzowanie maksymalnego przesunięcia (użyj ujemnej wartości dla nieokreślonej odległości). *'move_contact_all(dir,maxdist)' Działa tak samo jak poprzednia funkcja z tą różnicą, że wykrywa kontakt z dowolnym obiektem, nie tylko z tymi z parametrem solid. *'move_outside_solid(dir,maxdist)' Przesuwa instancję w danym kierunku do momentu aż wyjdzie z obiektu z parametrem solid. Jeśli na aktualnej pozycji nie zachodzi kolizja instancja nie jest przesuwana. Możliwe jest sprecyzowanie maksymalnego przesunięcia (użyj ujemnej wartości dla nieokreślonej odległości). *'move_outside_all(dir,maxdist)' Działa tak samo jak poprzednia funkcja z tą różnicą, że przesuwa na zewnątrz dowolnego obiektu, nie tylko z tymi z parametrem solid. *'distance_to_point(x,y)' Zwraca odległość od brzegu maski aktualnej instancji do punktu (x,y). (Jeśli instancja nie posiada sprite'a ani maski, wynik funkcji jest niezdefiniowany.) *'distance_to_object(obj)' Zwraca odległość instancji do najbliższej instancji obiektu obj. (Jeśli instancja lub obiekt nie posiada sprite'a ani maski, wynik funkcji jest niezdefiniowany.) *'position_empty(x,y)' Zwraca czy na pozycji (x,y) nie ma nic. *'position_meeting(x,y,obj)' Zwraca czy na pozycji (x,y) jest instancja obj. obj może być obiektem, id instancji, albo słowem kluczowym self, other lub all.